package com.xique.park.service.biz.service;

import com.xique.common.core.web.domain.AjaxResult;
import com.xique.park.bean.domain.ParkCar;
import com.xique.park.bean.domain.ParkChargeCarFixed;
import com.xique.park.bean.domain.ParkUpdateCarLog;
import com.xique.park.bean.request.app.*;
import com.xique.park.bean.request.app.ParkCarListRequest;
import com.xique.park.bean.request.web.car.*;
import com.xique.park.bean.request.web.parkcar.ParkCarRequest;
import com.xique.park.bean.search.app.ParkPlateCheckSearch;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 车辆管理
 *
 * @author lxl
 */
public interface IParkCarBizService {

    /**
     * 获取车辆管理列表
     *
     * @param request 请求参数
     * @return 请求结果
     * @author lxl
     * @date 2021/12/14
     */
    AjaxResult getParkCarList(ParkCarListRequest request);

    /**
     * 获取某辆车具体信息
     *
     * @param carId 车辆ID
     * @return 车辆具体信息
     */
    AjaxResult getParkCarInfo(Long carId);

    /**
     * 获取某辆车续费页面具体信息
     *
     * @param carId 车辆ID
     * @return 车续费页面具体信息
     */
    AjaxResult getParkCarFeeInfo(Long carId);

    /**
     * 添加车辆
     *
     * @param request 请求参数
     * @return 处理结果
     */
    AjaxResult addParkCar(ParkCarAddRequest request);

    /**
     * 修改车辆
     *
     * @param request 请求参数
     * @return 处理结果
     */
    AjaxResult editParkCar(ParkCarEditRequest request);

    /**
     * 车辆续期
     *
     * @param request 请求参数
     * @return 处理结果
     */
    AjaxResult feeParkCar(ParkCarFeeRequest request);

    /**
     * 删除单个车辆
     *
     * @param request 请求参数
     * @return 处理结果
     */
    AjaxResult delParkCar(ParkCarDeleteRequest request);

    /**
     * 计算固定车月金额（车位数*月租金）
     *
     * @param spaceCnt           车位数
     * @param parkChargeCarFixed 计费规则
     * @return 月金额
     */
    Long calFixedCarMonthFee(Integer spaceCnt, ParkChargeCarFixed parkChargeCarFixed);

    /**
     * 校验车场车牌唯一性
     *
     * @param request 请求参数
     * @return 校验结果
     */
    AjaxResult checkPlateUnique(ParkCarUniqueCheckRequest request);

    /**
     * 保存车辆的时候，车牌校验
     *
     * @param search 请求参数
     * @return 校验结果
     */
    Map<String, Object> checkPlateUnique(ParkPlateCheckSearch search);

    /**
     * 计算月卡车应收金额
     *
     * @param request 请求参数
     * @return 月卡车应收金额
     */
    AjaxResult calFixedFee(ParkCarCalFixedFeeRequest request);

    /* ------------------------- web接口，和移动端接口略有不同，分开处理 ------------------------- */

    /**
     * web车辆列表
     *
     * @param request 请求参数
     * @return 车辆列表
     */
    AjaxResult getWebParkCarList(ParkCarRequest request);

    /**
     * 添加车辆
     *
     * @param request 请求参数
     * @return 添加结果
     */
    AjaxResult addWebParkCar(ParkCarAddRequest request);

    /**
     * 编辑车辆
     *
     * @param request 请求参数
     * @return 编辑结果
     */
    AjaxResult editWebParkCar(ParkCarEditRequest request);

    /**
     * 批量续费
     *
     * @param request 请求参数
     * @return 续费结果
     */
    AjaxResult batchFeeParkCar(ParkCarBatchFeeRequest request);

    /**
     * 批量删除车辆
     *
     * @param request 请求参数
     * @return 删除结果
     */
    AjaxResult batchDeleteParkCar(ParkCarBatchDeleteRequest request);

    /**
     * 车辆详情
     *
     * @param carId 车辆ID
     * @return 车辆详情
     */
    AjaxResult getParkCarDetailInfo(Long carId);

    /**
     * 车辆储值
     *
     * @param request 请求参数
     * @return 储值结果
     */
    AjaxResult deposit(ParkCarDepositRequest request);

    /**
     * 单辆车下发
     *
     * @param request 请求参数
     * @return 下发结果
     */
    AjaxResult downOne(ParkCarDownRequest request);

    /**
     * 选中多辆车下发
     *
     * @param request 请求参数
     * @return 下发结果
     */
    AjaxResult batchDown(ParkCarDownRequest request);

    /**
     * 下发全部车辆
     *
     * @return 下发结果
     */
    AjaxResult downAll();

    /**
     * 车辆暂停
     *
     * @param request 请求参数
     * @return 下发结果
     */
    AjaxResult pauseParkCar(ParkCarPauseRequest request);

    /**
     * 查询车辆续费记录
     *
     * @param request 请求参数
     * @return 车辆续费记录
     */
    AjaxResult getParkCarFeeList(ParkCarFeeListRequest request);

    /**
     * 查询车辆在场状态
     *
     * @param request 请求参数
     * @return 车辆在场状态
     */
    AjaxResult getOnStatus(ParkCarOnStatusRequest request);

    /**
     * 储值页面信息回显
     *
     * @param carId 车辆ID
     * @return 储值页面信息
     */
    AjaxResult getParkCarDepositInfo(Long carId);

    /**
     * web端编辑车辆信息回显
     *
     * @param carId 车辆ID
     * @return 车辆信息
     */
    AjaxResult getWebParkCarInfo(Long carId);

    /**
     * 车库车位处理
     *
     * @param enGarageSpaces 是否分车库
     * @param carId          车辆id
     * @param spaceList      车库列表
     * @return 处理结果
     */
    boolean garageSpacesHandle(String enGarageSpaces, Long carId, List<ParkCarAddGarageSpaceRequest> spaceList);

    /**
     * 获取某条车辆记录的车位信息
     *
     * @param carId 车辆ID
     * @return 车辆记录的车位信息
     */
    List<ParkCarAddGarageSpaceRequest> getCarGarageSpacesList(Long carId);

    /**
     * 下载导入车辆excel模板
     *
     * @param response /
     * @throws IOException IO异常
     */
    void importTemplate(HttpServletResponse response) throws IOException;

    /**
     * 导入车辆
     *
     * @param parkCarList   车辆列表
     * @param updateSupport 是否更新
     * @return 导入结果
     */
    AjaxResult importParkCarNew(List<ParkCar> parkCarList, boolean updateSupport);

    /**
     * 移除黑名单
     *
     * @param request 请求参数
     * @return 移除结果
     */
    AjaxResult removeBlack(ParkCarDeleteRequest request);

    /**
     * 删除超过了有效期的黑名单车辆
     */
    void removeBlackExpire();

    /**
     * 下发到了启用日期的黑名单车辆
     */
    void downEnableBlackCar();

    /**
     * 查询车辆信息，不分页
     *
     * @param request /
     * @return /
     */
    AjaxResult simpleParkCarList(ParkCar request);

    /**
     * 导出车辆
     *
     * @param parkCar  /
     * @param response /
     * @throws IOException 导出IO异常
     */
    void export(ParkCar parkCar, HttpServletResponse response) throws IOException;

    /*================================================================ 开元酒店定制接口 ====================================================*/

    /**
     * @description: 获取访客车列表
     * @author: HdongSun
     * @date: 2022/8/25 11:44
     * @param: [request]
     * @return: com.xique.common.core.web.domain.AjaxResult
     **/
    AjaxResult getWebParkVisitorCarList(ParkCarRequest request);

    /**
     * @description: 添加访客车（开元酒店定制接口）
     * @author: HdongSun
     * @date: 2022/8/23 9:44
     * @param: [request]
     * @return: com.xique.common.core.web.domain.AjaxResult
     **/
    AjaxResult addVisitorCar(ParkVisitorCarAddRequest request);

    /*================================================================ 数据处理 ====================================================*/
    /**
     * 车辆用户数据处理
     * 只记录在park_car表的用户信息 在t_user表生成对应用户信息 并绑定两者关系
     * @author shd
     * @date 2022/6/30 9:50
     * @param id 项目id
     * @return com.xique.common.core.web.domain.AjaxResult
     */
    AjaxResult dataDeal(Long id);


    /**
     * 记录车辆前后续期记录
     * @param feeCarLogRequest
     * @return
     */
    AjaxResult selectDelayCarLog(FeeCarLogRequest feeCarLogRequest);

    /**
     * 查询储值记录
     * @param request
     * @return
     */
    AjaxResult selectDepositLog(DepositLogRequest request);
}
